package com.parking.mgr.useraccount.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.parking.mgr.useraccount.model.entity.UserInfoEntity;
import com.parking.mgr.useraccount.model.entity.UserPhoneEntity;
import com.parking.mgr.useraccount.model.param.UpdateUserInfoParam;
import com.parking.mgr.useraccount.model.param.UserInfoParam;
import com.parking.mgr.useraccount.model.param.UserRoleParam;
import com.parking.mgr.useraccount.model.vo.UserFullInfoVO;
import com.parking.mgr.useraccount.model.vo.UserHeadImgFileVO;
import com.parking.mgr.useraccount.model.vo.UserInfoVO;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Collection;
import java.util.List;

/**
 * @ClassName BasicUserInfoService
 * @Description 系统用户service接口
 * @Auther: zhijianpu
 * @Date: 2023/5/25
 */
public interface UserInfoService extends IService<UserInfoEntity> {

    /**
     * 增加用户平台信息
     *
     * @param userInfoParam
     */
    void addUserInfo(UserInfoParam userInfoParam);

    /**
     * 更新用户信息手机号
     *
     */
    void updateUserPhone(UserPhoneEntity userPhoneEntity);

    /**
     * 根据所属账号ID查询用户信息
     *
     * @param request
     * @return
     */
    UserFullInfoVO detail(HttpServletRequest request);

    UserFullInfoVO getUserByUserInfoId(String id);

    /**
     * 编辑用户信息
     *
     * @param updateUserInfoParam
     */
    void editUserInfo(UpdateUserInfoParam updateUserInfoParam);

    /**
     * 编辑用户信息(登录用户)
     *
     * @param updateUserInfoParam
     * @param request
     */
    void editUserSelfInfo(UpdateUserInfoParam updateUserInfoParam, HttpServletRequest request);


    /**
     * 删除用户信息
     *
     * @param ids
     */
    void deleteUserInfo(Collection<String> ids);

    /**
     * 用户信息列表（分页）
     *
     * @param userInfoParam
     * @return
     */
    IPage<UserInfoVO> listUserInfo(UserInfoParam userInfoParam);

    /**
     * 用户完整信息列表（分页）
     *
     * @param userInfoParam
     * @return
     */
    IPage<UserFullInfoVO> listUserInfoFull(UserInfoParam userInfoParam);

    /**
     * 根据用户ID获取用户信息
     *
     * @param id
     * @return
     */
    UserInfoEntity getUserInfoById(String id);

    /**
     * 根据用户账号获取用户信息
     *
     * @param passportId
     * @return
     */
    UserInfoEntity getUserInfoByPassportId(String passportId);

    /**
     * 为用户分配角色
     *
     * @param userRoleParam
     */
    void setRoleUser(UserRoleParam userRoleParam);

    /**
     * 根据用户ID获取角色列表
     *
     * @param userInfoId
     * @return
     */
    List<String> roleUserList(String userInfoId);

    /**
     * 上传用户头像
     *
     * @param uploadFile
     * @param request
     * @param uploadPath
     * @return
     */
    UserHeadImgFileVO uploadHeadImg(MultipartFile uploadFile, HttpServletRequest request, String uploadPath);

    /**
     * 登录用户所属角色的功能菜单列表
     *
     * @param request
     * @return
     */
    List<String> getRoleUserMenuList(HttpServletRequest request);

    /**
     * 判断当前请求连接是是否是该用户角色的请求连接
     *
     * @param request
     * @return
     */
    boolean isRoleUserMenu(HttpServletRequest request);

    /**
     * 根据文件ID获取头像文件，返回输出流
     *
     * @param id
     */
    byte[] getUserHeadImageFile(String id, HttpServletResponse response) throws IOException;

    // 返回文件流方法
    // ResponseEntity<FileSystemResource> getUserHeadImageFile(String id, HttpServletResponse response) throws IOException;

    /**
     * 上传文件到文件系统
     *
     * @param uploadFile
     * @param request
     * @return
     */
    UserHeadImgFileVO uploadHeadImgFileSys(MultipartFile uploadFile, HttpServletRequest request);

    /**
     * 从文件系统下载图片
     *
     * @param id
     * @return
     */
    byte[] getHeadImageFileByFileSys(String id) throws IOException;

    String getSmsCode(String phone);

    String logout(HttpServletRequest request);
}
